The relentless pace of advancing technology has given rise to complex computer software applications that assist with almost every aspect of day-to-day life. These applications exist in virtually every field, such as analyzing radio telescope signals for signs of intelligent life among the stars, finding new oil deposits under the earth, and designing new automobiles. One nearly ubiquitous feature of these applications is that they employ graphical user interfaces (GUIs). Another nearly ubiquitous aspect of GUI applications (GAPs) is that they are complex, difficult to design, and difficult to debug.
In the past it has generally been easier to implement the GUI to the application than to thoroughly test the GAP logic. For GAPs of any significant complexity, the permutations and combinations of GUI elements give rise to an enormous field of potential interactions with GUI elements, other GAPs, and logic execution that could have bugs of any severity, from insignificant to critical failure. Exacerbating the problem is that application developers are under pressure to continually add new features, update the GUI, and release new versions of applications.
Manually testing large-scale enterprise GAPs is tedious, error prone, and laborious. Nontrivial GAPs contain hundreds of GUI screens that in turn contain thousands of GUI elements. In order to automate testing of GAPs, test engineers write programs using scripting languages (e.g., JavaScript and VBScript), and these testing scripts drive GAPs through different states by mimicking users who interact with the GAP by performing actions on the GAP GUI objects.
Notably, these testing procedures operate on the GAP after it has been designed, built, and is in executable form. During the design of the GAP, however, little guidance was available to the designer for how to build and debug the GAP itself. In an effort to provide some level of documentation, designers sometimes generated a wireframe model of the GUI and attached informal notations to elements in the model. However, this ad-hoc approach translated into faulty GAPs at run time, particularly when the GAP had more than minimal complexity.
Therefore, a need exists to address the problems noted above and other previously encountered.